我们将在下面几节中创建同步和异步错误。\par

\hspace*{\fill} \par %插入空行
\textbf{同步错误}

\hspace*{\fill} \par %插入空行
图5-2 创建同步错误
\begin{lstlisting}[caption={}]
	#include <CL/sycl.hpp>
	using namespace sycl;
	
	int main() {
		buffer<int> B{ range{16} };
		
		// ERROR: Create sub-buffer larger than size of parent buffer
		// An exception is thrown from within the buffer constructor
		buffer<int> B2(B, id{8}, range{16});
		
		return 0;
	}
	/*
	Example output:
	terminate called after throwing an instance of 
	'cl::sycl::invalid_object_error'
	what(): Requested sub-buffer size exceeds the size of the parent buffer 
	-30 (CL_INVALID_VALUE)
	*/
\end{lstlisting}

图5-2中，缓冲区创建了子缓冲区，但其大小非法(大于原始缓冲区)。子缓冲区的构造函数检测到错误，并在构造函数完成之前抛出异常。这是一个同步错误，因为是主机程序的一部分(与主机程序同步)。构造函数返回前错误可检测到，因此错误可以在起始点或主程序中的检测点处进行处理。\par

代码示例没有执行任何捕获和处理C++异常的操作，因此程序会调用std::terminate。\par

\hspace*{\fill} \par %插入空行
\textbf{异步错误}

生成异步错误比较麻烦，因为实现会同步地检测和报告错误。同步错误发生在主程序中特定的起始点，所以更容易调试。不过，为演示目的生成异步错误的一种方法是，向命令组提交添加一个应急/备用队列，并丢弃会抛出的同步异常。图5-3就是这样的代码，调用了handle\_async\_error函数。异步错误可以在没有应急/备用队列的情况下发生和报告，因此备用队列只是示例的一部分，异步错误实际不需要这个队列。\par

\hspace*{\fill} \par %插入空行
图5-3 创建异步错误
\begin{lstlisting}[caption={}]
#include <CL/sycl.hpp>
using namespace sycl;

// Our simple asynchronous handler function
auto handle_async_error = [](exception_list elist) {
	for (auto &e : elist) {
		try{ std::rethrow_exception(e); }
		catch ( sycl::exception& e ) {
			std::cout << "ASYNC EXCEPTION!!\n";
			std::cout << e.what() << "\n";
		}
	}
};

void say_device (const queue& Q) {
	std::cout << "Device : "
	<< Q.get_device().get_info<info::device::name>() << "\n";
}

int main() { 
	queue Q1{ gpu_selector{}, handle_async_error };
	queue Q2{ cpu_selector{}, handle_async_error };
	say_device(Q1);
	say_device(Q2);
	
	try {
		Q1.submit([&] (handler &h){
			// Empty command group is illegal and generates an error
		},
		Q2); // Secondary/backup queue!
	} catch (...) {} // Discard regular C++ exceptions for this example
	return 0;
}
/*
Example output:
Device : Intel(R) Gen9 HD Graphics NEO
Device : Intel(R) Xeon(R) E-2176G CPU @ 3.70GHz
ASYNC EXCEPTION!!
Command group submitted without a kernel or a explicit memory operation. -59 (CL_INVALID_OPERATION)
*/
\end{lstlisting}






